本发明公开了一种数据读写分离机制的实现方法和装置。本发明实施例提供的一种数据读写分离机制的实现方法,在读操作的SQL访问请求中设置HINT信息,该HINT信息指示读写分离策略,本方法包括对接收到的SQL访问请求进行解析,判断当前的操作类型;若当前的操作类型为写操作,建立与主数据库的连接,向主数据库中写入数据;若当前的操作类型为读操作,根据SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作。本方案能够在从库出现延时的情况下读取到所需的可信任数据,且较好地兼容了现有的系统资源,提高了资源的利用率。
1.一种数据读写分离机制的实现方法,其特征在于,在读操作的结构化查询语言SQL访问请求中设置提示HINT信息,所述HINT信息指示读写分离策略,所述方法包括:对接收到的SQL访问请求进行解析,判断当前的操作类型;若当前的操作类型为写操作,建立与主数据库的连接,向主数据库中写入数据;若当前的操作类型为读操作,根据所述SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作;所述读写分离策略至少包括如下的一种:仅在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,当存在与主数据库同步的从数据库时,从该从数据库中读取数据,否则,从主数据库中读取数据;或者,先从主数据库中读取数据,当主数据库读取失败时,再从延时小于预定阈值的从数据库中读取数据,若不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,先在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,从主数据库中读取数据。
2.根据权利要求1所述的方法,其特征在于,一个主数据库对应于多个从数据库,所述获取从数据库相对于主数据库的同步延时信息包括:获取主数据库下每一从数据库相对于该主数据库的同步延时信息;所述根据当前的读写分离策略和同步延时信息执行读操作包括:根据当前的读写分离策略和多个从数据库的同步延时信息执行读操作。
3.根据权利要求1所述的方法,其特征在于,通过下述的至少一种方式,根据当前的读写分离策略和同步延时信息执行读操作:与延时小于预定阈值的从数据库建立连接,从建立连接的从数据库中读取数据;或者,结束当前的读操作;或者,与同步于主数据库的从数据库建立连接,从建立连接的从数据库中读取数据;或者,与主数据库建立连接,从主数据库中读取数据;或者,与所存在的任一从数据库建立连接,从建立连接的从数据库中读取数据。
4.根据权利要求1至3任一项所述的方法,其特征在于,通过下述至少一种方式获取从数据库相对于主数据库的同步延时信息:接收从数据库上报的相对于主数据库的同步延时信息;或者,对从数据库的同步延时状态进行监控,根据监控结果获知从数据库相对于主数据库的同步延时信息。
5.一种数据读写分离机制的实现装置,其特征在于,所述装置包括:设置单元,用于在读操作的结构化查询语言SQL访问请求中设置提示HINT信息,所述HINT信息指示读写分离策略;解析判断单元,用于对接收到的SQL访问请求进行解析,判断当前的操作类型;写操作单元,用于在当前的操作类型为写操作时,建立与主数据库的连接,向主数据库中写入数据;读操作单元,用于在当前的操作类型为读操作时,根据所述SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作;其中,所述设置单元所设置的HINT信息指示的读写分离策略至少包括如下的一种:仅在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,当存在与主数据库同步的从数据库时,从该从数据库中读取数据,否则,从主数据库中读取数据;或者,先从主数据库中读取数据,当主数据库读取失败时,再从延时小于预定阈值的从数据库中读取数据,若不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,先在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,从主数据库中读取数据。
6.根据权利要求5所述的装置,其特征在于,一个主数据库对应于多个从数据库,所述读操作单元包括信息获取模块和读取模块,所述信息获取模块,用于获取主数据库下每一从数据库相对于该主数据库的同步延时信息;所述读取模块,用于根据当前的读写分离策略和多个从数据库的同步延时信息执行读操作。
7.根据权利要求6所述的装置,其特征在于,所述装置还包括数据库连接单元,所述数据库连接单元,至少用于与延时小于预定阈值的从数据库建立连接;或者,所述数据库连接单元,至少用于与同步于主数据库的从数据库建立连接;或者,所述数据库连接单元,至少用于与主数据库建立连接;或者,所述数据库连接单元,至少用于与所存在的任一从数据库建立连接;所述读取模块,用于从建立连接的从数据库或主数据库中读取数据。
8.根据权利要求7所述的装置,其特征在于,所述信息获取模块通过下述至少一种方式获取从数据库相对于主数据库的同步延时信息:接收从数据库上报的相对于主数据库的同步延时信息;或者,对从数据库的同步延时状态进行监控,根据监控结果获知从数据库相对于主数据库的同步延时信息。
技术领域本发明涉及领域数据处理技术领域,特别涉及一种数据读写分离机制的实现方法和装置。
背景技术在互联网数据库解决方案中,关系型数据库MySQL是一种较常用的数据库,MySQL在数据访问并发量较高的情况下一般会采用读写分离的技术。现有的读写分离方案是开发两种角色的数据库连接串,一种角色的连接串作为主库(master),另一种角色的连接串作为从库(slave),一个主库可以对应于多个从库。主库可以进行写操作,也可以担任读操作,从库只能担任读操作。若需要进行数据的读操作或写操作,在请求时,对于写操作,一定是向主库发送请求,对于读操作,可以在Slave角色的从库中分配一个连接,进行读的操作。现有的数据读写分离方案至少存在如下缺陷:现有的读写分离方案只能做到要么在主库上执行查询,要么在从库上执行查询,查询方式不够灵活;且当从库出现问题时,如从库相对于主库的数据同步延时较多的情况下,现有方案仍采用直接由从库中读取数据的方式,从而导致无法在从库中读取出数据,或者,所读取到的数据与所需的数据不一致,读取出的是不可信任的数据(脏数据)的问题。
发明内容本发明提供了一种数据读写分离机制的实现方法和装置,以解决现有方案查询方式不够灵活,以及在从库中读取数据时读不到数据或读到脏数据的问题。为达到上述目的,本发明实施例采用了如下技术方案:本发明实施例提供了一种数据读写分离机制的实现方法,在读操作的结构化查询语言SQL访问请求中设置提示HINT信息,所述HINT信息指示读写分离策略,所述方法包括:对接收到的SQL访问请求进行解析,判断当前的操作类型;若当前的操作类型为写操作,建立与主数据库的连接,向主数据库中写入数据;若当前的操作类型为读操作,根据所述SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作;所述读写分离策略至少包括如下的一种:仅在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,当存在与主数据库同步的从数据库时,从该从数据库中读取数据,否则,从主数据库中读取数据;或者,先从主数据库中读取数据,当主数据库读取失败时,再从延时小于预定阈值的从数据库中读取数据,若不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,先在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,从主数据库中读取数据。本发明实施例还提供了一种数据读写分离机制的实现装置,所述装置包括:设置单元,用于在读操作的结构化查询语言SQL访问请求中设置提示HINT信息,所述HINT信息指示读写分离策略;解析判断单元,用于对接收到的SQL访问请求进行解析,判断当前的操作类型;写操作单元,用于在当前的操作类型为写操作时,建立与主数据库的连接,向主数据库中写入数据;读操作单元,用于在当前的操作类型为读操作时,根据所述SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作;所述设置单元所设置的HINT信息指示的读写分离策略至少包括如下的一种:仅在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,当存在与主数据库同步的从数据库时,从该从数据库中读取数据,否则,从主数据库中读取数据;或者,先从主数据库中读取数据,当主数据库读取失败时,再从延时小于预定阈值的从数据库中读取数据,若不存在延迟小于预定阈值的从数据库时,将访问请求加入等待队列;或者,先在延时小于预定阈值的从数据库中读取数据,当不存在延迟小于预定阈值的从数据库时,从主数据库中读取数据。本发明实施例的有益效果是:本发明实施例提供的数据读写分离机制在应用和数据库之间引入一个代理层,设置读写分离策略,并利用读写分离策略确定当前所执行读操作的具体方式,大大提高了数据查询方式的灵活性;且由于本发明实施例还基于从库的同步延时信息执行读操作,能够避免从库出现同步延时读不出数据或读取出脏数据的现象的发生,读取到所需的可信任数据。本发明实施例采用HINT的方式将读写分离策略设置在SQL语句中,不但操作简单有效,且能够避免对原有SQL语句的大量修改,较好地兼容现有的系统资源,提高了资源的利用率。
附图说明图1为本发明实施例一提供的一种数据读写分离机制的实现方法流程图;图2为本发明实施例二提供的一种数据读写分离机制的实现装置结构示意图;图3为在应用和MySQL数据库之间所设置的一个代理层逻辑结构示意图。
具体实施方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。参见图1,为本发明实施例一提供的一种数据读写分离机制的实现方法流程图,具体包括:11:接收结构化查询语言(Structuredxa0Queryxa0Language,SQL)访问请求。12:判断该SQL访问请求对应的当前的操作类型。对SQL访问请求进行解析,判断当前的操作类型是写操作还是读操作。13:若当前的操作类型为写操作,建立与主数据库(下文简称为主库)的连接,向主库中写入数据。14:若当前的操作类型为读操作,根据所述SQL访问请求中的提示(HINT)信息获取当前的读写分离策略,并获取从数据库(下文简称为从库)相对于主库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作。接收到的读操作的SQL访问请求中设置提示(HINT)信息,该HINT信息指示读写分离策略。由于访问请求方能够控制当前操作类型是写操作还是读操作,访问请求方在发送读操作的SQL访问请求时,通过代理层在该SQL访问请求中设置HINT信息,在发送写操作的SQL访问请求时,由于写操作必须在主库中进行,可以无需再设置HINT信息,以在应用本方案时简化操作,节省资源。进一步的,对一个主库对应于多个从库的场景,本实施例获取主库下每一从库相对于该主库的同步延时信息,根据当前的读写分离策略和多个从库的同步延时信息执行读操作。例如,一种主/从(master/slave)架构下,主库1对应于从库1至从库3,则分别获取从库1至从库3相对应与主库1的同步延时信息,如同步延时信息1至同步延时信息3,该同步延时信息指示从库相对于主库的延时大小。根据当前的读写分离策略结合同步延时信息1至同步延时信息3执行读操作。进一步的,本实施例所提供的读写分离策略至少包括如下的一种:策略一:仅在延时小于预定阈值的从库中读取数据,当不存在延迟小于预定阈值(如60秒)的从库时,即不满足策略一中所限定的条件时,将访问请求加入等待队列,直至满足读取条件,或者,主库发生Down机(停机),向客户端发送请求超时报错。策略二:当存在与主库同步的从库时,从该从库中读取数据,否则,从主库中读取数据。当不满足策略二中所限定的条件时,例如,暂时获取不到主库连接时,将访问请求加入等待队列,直至满足读取条件,或者,若主库发生Down机,向客户端发送请求超时报错。策略三:不考虑从库延时,仅在从库中读取数据。当不满足策略三中所限定的条件时,例如,从库读取数据失败时,这可分两种情况,一种情况是暂时获取不到从库的连接,则将访问请求加入等待队列,直至满足读取条件,另一种情况,从库全部Down机,已经没可用的从库,则向客户端发送请求超时报错。策略四:仅在主库中读取数据。当不满足策略四中所限定的条件时,例如,获取不到主库的连接时,将访问请求加入等待队列,直至满足读取条件,或者,若主库发生Down机,向客户端发送请求超时报错。策略五:先从主库中读取数据,当主库读取失败,如主库繁忙,获取不到可用连接,再从延时小于预定阈值的从库中读取数据,若不存在延迟小于预定阈值的从库时,将访问请求加入等待队列,直至满足读取条件,或是,若从库发生Down机,向客户端发送请求超时报错。策略六:先在延时小于预定阈值的从库中读取数据,当不存在延迟小于预定阈值的从库时,从主库中读取数据。当不满足策略六中所限定的条件时,例如,主库读取失败时,将访问请求加入等待队列,直至满足读取条件,或是,向客户端发送请求超时报错。通过上述读写分离策略,本实施例在执行读操作时,当从库出现问题时,如数据同步延迟较多的情况下,实现对从库查询的智能控制,例如,不再进行当前从库查询(读数据)并将查询请求加入等待队列,或是在slave的角色中选择不延迟的从库进行查询,或是,把该查询转到主库上执行等,这种智能控制方式不但大大提高了查询的灵活性,也能通过读写分离策略的设置避免在从库中读不到数据或者读取出脏数据。进一步的,本实施例中采用HINT的方式将读写分离策略设置在SQL访问语句中,即以一种执行语句注释信息的方式将读写分离策略设置在SQL访问语句中,从而避免了对现有方案中执行语句进行修改,仅需要使代理层具备对SQL语句中HINT信息解析的能力即可。例如,对于上述策略一的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select...该策略一的示例表示当前读操作只在slave上执行,延迟在低于60秒以内从库都可进行读操作,若从库的延时都在60秒以上,结束当前读操作,不再执行数据读取。对于上述策略二的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select...该策略二的示例表示当前读操作不允许有数据延迟,如从库发生延迟该SQL访问请求会升级转移到master上执行,即当存在与主库同步的从库时,从该从库中读取数据,否则,从主库中读取数据。对于上述策略三的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select该策略三的示例表示当前读操作只在从库上执行不管同步延迟情况。对于上述策略四的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select...该策略四的示例表示当前读操作只在只在主库上执行,即仅在主库中读取数据。对于上述策略五的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select...该策略五的示例表示当前读操作优先在主库上执行,当主库读取失败时如查找不到master连接时,再去slave上执行,slave上延迟不能大于60秒,若不存在延时小于60秒的从库时,结束当前读操作。对于上述策略六的一个示例,在SQL访问语句中所添加的HINT信息可以表示为如下述斜线/之间的部分所示(在此略去具体的SQL访问语句):Select该策略六的示例表示当前读操作优先在Slave上执行,而且要求该从库的延迟在60秒以内,如果从库都不满足60秒以内的延时要求,再从主库中读取数据。进一步的,相应于读取分离策略,本实施例中根据当前的读写分离策略和同步延时信息执行读操作可以包括如下处理方式:与延时小于预定阈值的从库建立连接,从建立连接的从库中读取数据;或者,结束当前的读操作;或者,与同步于主库的从库建立连接,从建立连接的从库中读取数据;或者,与主库建立连接,从主库中读取数据;或者,与所存在的任一从库建立连接,从建立连接的从库中读取数据。进一步的,本实施例可以通过下述至少一种方式获取从库相对于主库的同步延时信息:接收从库上报的相对于主库的同步延时信息。这种方式下,由从库对自身的同步延时状态进行记录,并将对应的同步延时信息告知代理层;或者,由代理层对从库的同步延时状态进行监控,根据监控结果获知从库相对于主库的同步延时信息。本发明实施例提供的数据读写分离机制在应用和数据库之间引入一个代理层,设置读写分离策略,并利用读写分离策略确定当前所执行读操作的具体方式,大大提高了数据查询方式的灵活性;且由于本发明实施例还基于从库的同步延时信息执行读操作,能够避免从库出现同步延时读不出数据或读取出脏数据的现象的发生,读取到所需的可信任数据。本发明实施例采用HINT的方式将读写分离策略设置在SQL语句中,不但操作简单有效,且能够避免对原有SQL语句的大量修改,较好地兼容现有的系统资源,提高了资源的利用率。本发明实施例二提供了一种数据读写分离机制的实现装置,参见图2,所述装置包括:设置单元21,用于在读操作的结构化查询语言SQL访问请求中设置提示HINT信息,所述HINT信息指示读写分离策略;解析判断单元22,用于对接收到的SQL访问请求进行解析,判断当前的操作类型;写操作单元23,用于在当前的操作类型为写操作时,建立与主库的连接,向主库中写入数据;读操作单元24,用于在当前的操作类型为读操作时,根据所述SQL访问请求中的HINT信息获取当前的读写分离策略,并获取从库相对于主库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作。当一个主库对应于多个从库,所述读操作单元24包括信息获取模块和读取模块。该信息获取模块,用于获取主库下每一从库相对于该主库的同步延时信息;该读取模块,用于根据当前的读写分离策略和多个从库的同步延时信息执行读操作。进一步的,所述设置单元21所设置的HINT信息指示的读写分离策略至少包括如下的一种:仅在延时小于预定阈值的从库中读取数据,当不存在延迟小于预定阈值的从库时,将访问请求加入等待队列;或者,当存在与主库同步的从库时,从该从库中读取数据,否则,从主库中读取数据;或者,不考虑从库延时,仅在从库中读取数据;或者,仅在主库中读取数据,当主库读取失败时,将访问请求加入等待队列;或者,先从主库中读取数据,当主库读取失败时,再从延时小于预定阈值的从库中读取数据,若不存在延迟小于预定阈值的从库时,将访问请求加入等待队列;或者,先在延时小于预定阈值的从库中读取数据,当不存在延迟小于预定阈值的从库时,从主库中读取数据。进一步的,所述装置还包括数据库连接单元,至少用于与延时小于预定阈值的从库建立连接;或者,所述数据库连接单元,至少用于与同步于主库的从库建立连接;或者,所述数据库连接单元,至少用于与主库建立连接;或者,所述数据库连接单元,至少用于与所存在的任一从库建立连接。则所述读取模块,用于从建立连接的从库或主库中读取数据。进一步的,所述信息获取模块通过下述至少一种方式获取从库相对于主库的同步延时信息:接收从库上报的相对于主库的同步延时信息;或者,对从库的同步延时状态进行监控,根据监控结果获知从库相对于主库的同步延时信息。上述数据读写分离机制的实现装置设置在应用和数据库之间的一个代理层中,参见图3,显示了在应用和MySQL数据库之间所设置的一个代理层逻辑结构示意图。代理层中包含数据库协议代理逻辑、SQL解析逻辑层、数据库连接池和连接相关的统计逻辑,数据库连接池可以建立主库连接和从库连接。这些逻辑的功能可以集成在本实施例装置的具体单元中实现,或者,在本实施例装置中设置一个单独的模块实现,例如,利用本装置中的解析判断单元实现数据库协议代理逻辑的功能;数据库连接池可以由上述数据库连接单元实现;在本装置中设置一个统计模块用于实现连接相关的统计逻辑的功能。各个逻辑的具体功能如下:数据库协议代理逻辑:该逻辑层可以利用epoll方式封装的MySQL协议处理部分,以完成MySQL的认证,MySQL数据库包的解析及封装功能等。SQL解析逻辑层:该逻辑层用于从数据库包中解析出SQL访问语句,对读操作的SQL访问语句进行语法分析,提取出HINT部分,对HINT部分做相应的运算,从而得到建立什么样的连接的标准。数据库联接池:该逻辑层主要功能是进行数据库(主库或从库)连接的初始化及管理维护。当有新的访问(或查询)请求时,在经过SQL解析的得到相应的HINT及SQL操作类型后,即会来到本连接池中请求连接。如写操作会请求分配一个master的连接,读操作可以跟据HINT来查询得到一个相应的连接。连接相关的统计逻辑:该逻辑层从功能上区分的话,属于一个监控模块,主要的作用就是查询从库中同步的状态,同时把同步延迟情况更新到连接串的相关标识位上,对所建立的连接和访问操作的类型等进行记录,即该统计逻辑可以对代理层中的各种运行信息进行统计和记录,以便于对应用、代理层和数据库进行管理和维护。本发明实施例提供的数据读写分离机制在应用和数据库之间引入一个代理层,设置读写分离策略,并利用读写分离策略确定当前所执行读操作的具体方式,大大提高了数据查询方式的灵活性;且由于本发明实施例还基于从库的同步延时信息执行读操作,能够避免从库出现同步延时读不出数据或读取出脏数据的现象的发生,读取到所需的可信任数据。本发明实施例采用HINT的方式将读写分离策略设置在SQL语句中,不但操作简单有效,且能够避免对原有SQL语句的大量修改,较好地兼容现有的系统资源,提高了资源的利用率。以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。